class MyEntityLog {
  /**
   * className:dart文件类名，首字母大写
   * map:json
   */
  static String log(String className, Map map) {
    var list = createDart(className, map);
    if (list != null && list is List) {
      list.insert(0,
          "import 'package:mybase/base/tool/entitylog/MyEntityLog.dart';\n");
    }

    String resultStr = "";
    for (String string in list) {
      resultStr = "$resultStr\n$string";
      // print(string);
    }

    return resultStr;
  }

  //处理字符串
  static String handleString(Map<String, dynamic> json, String key,
      {String defaultValue = ""}) {
    var backStr = defaultValue;
    if (json.containsKey(key)) {
      var tmp = json[key];
      if (tmp is int || tmp is double || tmp is String) {
        backStr = '${json[key]}';
      } else {
        backStr = defaultValue;
      }
    } else {
      backStr = defaultValue;
    }
    return backStr;
  }

  //处理bool
  static bool handleBool(Map<String, dynamic> json, String key) {
    var backBool = false;
    if (json.containsKey(key)) {
      var tmp = json[key];
      if (tmp is bool) {
        backBool = json[key];
      } else {
        backBool = false;
      }
    } else {
      backBool = false;
    }

    return backBool;
  }

  //处理List

  //处理Map

  static String firstBig(String className) {
    String first = className[0].toUpperCase();
    String other = className.substring(1);
    return "${first}${other}";
  }

  static List<String> createDart(String className, Map map) {
    List<String> list = [];
    List<List<String>> inList = [];

    list.add("class $className {\n");

    String allocStr = "\n$className ({";

    //生成属性
    for (String key in map.keys) {
      var value = map[key];

      if (value != null) {
        allocStr = "$allocStr this.${key},";
        if (value is Map) {
          list.add("${firstBig(key)}? ${key};");
        } else if (value is List) {
          if (value.length > 0) {
            var firstObj = value.first;
            if (firstObj is Map) {
              list.add("List<${firstBig(key)}>? ${key};");
            } else if (firstObj is List) {
              list.add("List<List>? ${key};");
            } else if (firstObj is bool) {
              list.add("List<bool>? ${key};");
            } else {
              list.add("List<String>? ${key};");
            }
          }
        } else if (value is bool) {
          list.add("bool? ${key};");
        } else {
          list.add("String? ${key};");
        }
      }
    }

    list.add("$allocStr});\n");

    //生成fromJson方法
    list.add("\n${className}.fromJson(Map<String, dynamic> json) {\n");
    for (String key in map.keys) {
      var value = map[key];
      if (value != null) {
        if (value is Map) {
          //是map
          //list.add("\tif (json.containsKey('${key}')) {${key} = json['${key}'] != null ? new ${firstBig(key)}.fromJson(json['${key}']): null;} else {${key} = null;}");

          String tmp = """
    if (json.containsKey('${key}')) {
      var tmp = json['${key}'];
      if (tmp is Map) {
        ${key} = json['${key}'] != null ? new ${firstBig(key)}.fromJson(json['${key}']) : null;  
      } else {
        ${key} = null;  
      }
    } else {
      ${key} = null;
    }
          """;

          list.add(tmp);

          var mapList = createDart("\n\n${firstBig(key)}", value);
          inList.add(mapList);
        } else if (value is List) {
          //是List

          if (value.length > 0) {
            var firstObj = value.first;
            if (firstObj is Map) {
              //list.add("if (json.containsKey('${key}')) {if (json['${key}'] != null) {${key} = <${firstBig(key)}>[];json['${key}'].forEach((v) {${key}!.add(new ${firstBig(key)}.fromJson(v));});} else {${key} = [];}} else {${key} = [];}");

              String tmp = """
    if (json.containsKey('${key}')) {
      if (json['${key}'] != null && json['${key}'] is List) {
        ${key} = <${firstBig(key)}>[];
        json['${key}'].forEach((v) {
          ${key}!.add(new ${firstBig(key)}.fromJson(v));
        });
      } else {
        ${key} = [];
      }
    } else {
      ${key} = [];
    }
              """;

              list.add(tmp);

              var mapList = createDart("\n\n${firstBig(key)}", firstObj);
              inList.add(mapList);
            } else if (firstObj is List) {
              print("\t***数组里面套用数组解析出错******************\n");
              print("\t***数组里面套用数组解析出错********************\n");
              print("\t***数组里面套用数组解析出错**********************\n");
              print("\t***数组里面套用数组解析出错************************\n");
              assert(false, "数组里面套用数组解析出错");
            } else if (firstObj is bool) {
              //list.add("\tif (json.containsKey('${key}')) {${key} = json['${key}'].cast<bool>();} else {${key} = [];}");
              String tmp = """
    if (json.containsKey('${key}')) {
      var tmp = json['${key}'];
      if (tmp is List) {
        ${key} = json['${key}'].cast<bool>();
      } else {
        ${key} = [];
      }
    } else {
      ${key} = [];
    }
              """;

              list.add(tmp);
            } else {
              //list.add("\tif (json.containsKey('${key}')) {${key} = json['${key}'].cast<String>();} else {${key} = [];}");

              String tmp = """
    if (json.containsKey('${key}')) {
      var tmp = json['${key}'];
      if (tmp is List) {
        ${key} = json['${key}'].cast<String>();
      } else {
        ${key} = [];
      }
    } else {
      ${key} = [];
    }
              """;

              list.add(tmp);
            }
          }
        } else if (value is bool) {
          //是bool
          //list.add("\t${key} = json.containsKey('${key}') ? json['${key}'] : false;");

          //       String str = """
          // if (json.containsKey('${key}')) {
          //   var tmp = json['${key}'];
          //   if (tmp is bool) {
          //     ${key} = json['${key}'];
          //   }else {
          //     ${key} = false;
          //   }
          // } else {
          //   ${key} = false;
          // }
          //       """;
          //       list.add(str);

          list.add("${key} = MyEntityLog.handleBool(json,'${key}');");
        } else {
          //其他是String
          // list.add("\t${key} = json.containsKey('${key}') ? '\${json['${key}']}' : '';");

          //       String str = """
          // if (json.containsKey('${key}')) {
          //   var tmp = json['${key}'];
          //   if (tmp is int || tmp is double || tmp is String) {
          //     ${key} = '\${json['${key}']}';
          //   } else {
          //     ${key} = '';
          //   }
          // } else {
          //   ${key} = '';
          // }
          //       """;
          //       list.add(str);

          list.add("${key} = MyEntityLog.handleString(json,'${key}');");
        }
      }
    }
    list.add("\n}\n");

    //生成toJson方法
    list.add("Map<String, dynamic> toJson() {");
    list.add("\tfinal Map<String, dynamic> data = new Map<String, dynamic>();");
    for (String key in map.keys) {
      var value = map[key];

      if (value != null) {
        if (value is Map) {
          list.add(
              "\tif (this.${key} != null) {data['${key}'] = this.${key}!.toJson();}");
        } else if (value is List) {
          var firstObj = value.first;
          if (firstObj is Map) {
            list.add(
                "if (this.${key} != null) {data['${key}'] = this.${key}!.map((v) => v.toJson()).toList();}");
          } else if (firstObj is List) {
          } else {
            list.add("data['${key}'] = this.${key};");
          }
        } else {
          list.add("\tdata['${key}'] = this.${key};");
        }
      }
    }
    list.add("return data;");
    list.add("\n}\n");

    list.add("}\n");

    for (var tmp in inList) {
      list.addAll(tmp);
    }

    return list;
  }
}
